package metier;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;

import jdbc.Connexion;
import metier.jdbc.eleve.FonctionJdbc;
import metier.jdbc.grade.GradeJdbc;
import metier.jdbc.note.NoteEleveJdbc;
import configuration.Constante;

public class Eleve implements Comparable<Eleve>{
	
	// Attributs
	private Integer idEleve;
	private String nomEleve;
	private String prenom;
	private Date dateNaissance;
	private Integer idGrade;
	private Integer idStage;
	private Integer idFonction;
	private static int tri = Constante.TRI_ELEVE_NOM;
	
	// Constructeur
	public Eleve(Integer idEleve, String nomEleve, String prenom,
			Date dateNaissance, Integer idGrade, Integer idStage,
			Integer idFonction) {
		
		this.idEleve = idEleve;
		this.nomEleve = nomEleve;
		this.prenom = prenom;
		this.dateNaissance = dateNaissance;
		this.idGrade = idGrade;
		this.idStage = idStage;
		this.idFonction = idFonction;
	}
	
	/**
	 * @return
	 */
	public Vector<Object> getVector(){
		// "grade", "nom", "prenom", "date de naissance", "fonction"
		SimpleDateFormat sdf = new SimpleDateFormat(Constante.FORMAT_DATE_SHORT);
		Vector<Object> vector = new Vector<Object>();
		String abrev = GradeJdbc.getAbrevGradeById(Connexion.getConnexion(), this.idGrade);
		vector.add(abrev);
		vector.add(this.getNomEleve());
		vector.add(this.getPrenom());
		if (this.getDateNaissance() == null){
			vector.add("");
		}else{
			vector.add(sdf.format(this.getDateNaissance()));
		}
		Double moy = NoteEleveJdbc.getMoyenne(Connexion.getConnexion(), this);
		if ( moy != null ){
			DecimalFormat f = new DecimalFormat();
			f.setMaximumFractionDigits(2);
			vector.add(f.format(moy));
		}else{
			vector.add("");
		}
		Fonction fonction = FonctionJdbc.getFonctionById(Connexion.getConnexion(), this.getIdFonction());
		if ( fonction != null ){
			vector.add(fonction.getLibelleFonction());
		}
		return vector;
	}
	
	// Getters & Setters
	public Integer getIdEleve() {
		return idEleve;
	}
	public void setIdEleve(Integer idEleve) {
		this.idEleve = idEleve;
	}
	public String getNomEleve() {
		return nomEleve;
	}
	public void setNomEleve(String nomEleve) {
		this.nomEleve = nomEleve;
	}
	public String getPrenom() {
		return prenom;
	}
	public void setPrenom(String prenom) {
		this.prenom = prenom;
	}
	public Date getDateNaissance() {
		return dateNaissance;
	}
	public void setDateNaissance(Date dateNaissance) {
		this.dateNaissance = dateNaissance;
	}
	public Integer getIdGrade() {
		return idGrade;
	}
	public void setIdGrade(Integer idGrade) {
		this.idGrade = idGrade;
	}
	public Integer getIdStage() {
		return idStage;
	}
	public void setIdStage(Integer idStage) {
		this.idStage = idStage;
	}
	public Integer getIdFonction() {
		return idFonction;
	}
	public void setIdFonction(Integer idFonction) {
		this.idFonction = idFonction;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Eleve [idEleve=" + idEleve + ", nomEleve=" + nomEleve
				+ ", prenom=" + prenom + ", dateNaissance=" + dateNaissance
				+ ", idGrade=" + idGrade + ", idStage=" + idStage
				+ ", idFonction=" + idFonction + "]";
	}

	/**
	 * @return the tri
	 */
	public static int getTri() {
		return tri;
	}

	/**
	 * @param tri the tri to set
	 */
	public static void setTri(int tri) {
		Eleve.tri = tri;
	}

	@Override
	public int compareTo(Eleve o) {
		// TODO Auto-generated method stub
		switch (tri) {
		case  Constante.TRI_ELEVE_NOM:
			return this.getNomEleve().compareTo(o.getNomEleve());
		case Constante.TRI_ELEVE_PRENOM:
			return this.getPrenom().compareTo(o.getPrenom());
		case  Constante.TRI_ELEVE_DATE_NAISS: 
			return this.getDateNaissance().compareTo(o.getDateNaissance());
		case  Constante.TRI_ELEVE_GRADE: 
			Grade grade = GradeJdbc.getGradeById(Connexion.getConnexion(), this.getIdGrade());
			Grade gradeBis = GradeJdbc.getGradeById(Connexion.getConnexion(), o.getIdGrade());
			return grade.compareTo(gradeBis);
		case  Constante.TRI_ELEVE_MOYENNE: 
			Double moyenne = NoteEleveJdbc.getMoyenne(Connexion.getConnexion(), this);
			Double moyenneBis = NoteEleveJdbc.getMoyenne(Connexion.getConnexion(), o);
			if ( moyenne == null ){
				return -1;
			}else{
				return moyenne.compareTo(moyenneBis);
			}
		}
		return 0;
	}
}
